EL 入门教程

EL 简介

表达式语言(Expression Language),简称EL,是Java中的一种特殊的通用编程语言,借鉴于JavaScript和XPath。主要作用是在Java Web应用程序嵌入到网页(如JSP)中,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作,通常与JSTL一同使用。EL在得到某个数据时,会自动进行数据类型的转换。

EL 语法

EL表达式以“${”开始,以“}”作为结束:

1
${EL表达式}

注意:由于EL表达式的语法是以${开头,所以如果在JSP网页中要显示${字符串,必须在前面加上\符号,即\${或写成${‘${’}

禁用 EL

要使用EL表达式,Web服务器必须能够支持Servlet2.4/JSP2.0。由于JSP2.0以前的版本不支持EL,所以为了与低版本的环境兼容,JSP提供了以下三种禁用EL的方法。

使用斜杠

最简单的方法就是使用斜杠符号,其语法格式如下:

1
\${EL表达式}

使用page指令

使用JSP的page指令也可以禁用EL表达式,其语法格式如下:

1
<%@ page isELlgnored="true"%>

配置web.xml

在web.xml文件中配置元素可以实现禁用服务器中的EL。

1
2
3
4
5
6
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>

EL 运算符

EL 提供“.”、“[]”运算符、算术运算符、逻辑运算符、关系运算符、条件运算符以及empty运算符。

[]和.运算符

EL表达式可以返回任意类型的值。如果EL表达式的结果是一个带有属性的对象,则可以利用[]或者.运算符来访问该属性。其语法格式如下:

1
2
${object["propertyName"]}
${object.propertyName}

注意:
1、如果propertyName不是有效的Java变量名,只能使用[]运算符。
2、当对象的属性名中包括一些特殊的字符(如-.)时,只能使用[]运算符。

算术运算符

EL提供以下五种算术运算符:

运算符 功能 示例 结果
+ ${1+1} 2
- ${2-1} 1
* ${10*10} 100
/或div ${1/0}或${1 div 0} Infinite
%或mod 求余 ${1%0}或${1 mod 0} 抛出异常

注意:EL的“+”运算符和Java中的“+”运算符不同,它不能实现两个字符串之间的连接;如果使用EL的“+”运算符连接两个可以转换为数值型的字符串,EL则可以自动将这两个字符串转换为数值型,再进行加法运算。

逻辑运算符

逻辑运算符的条件表达式的值必须是Boolean型或是可以转换为Boolean型的字符串,并且返回的结果也是Boolean型。

运算符 功能
&& 或 and
|| 或 or
! 或 not

关系运算符

在EL中提供六种关系运算符,这六种关系运算符不仅可以用来比较整数和浮点数,还可以用来比较字符串,返回的结果为Boolean型。

运算符 功能
== 或 eq 等于
!= 或 ne 不等于
< 或 lt 小于
> 或 gt 大于
<= 或 le 小于等于
>= 或 ge 大于等于

条件运算符

在EL中进行简单的条件运算,可以通过条件运算符实现,其语法格式如下:

1
${条件表达式 ? 表达式1 : 表达式2}

说明:
条件表达式:用于指定一个条件表达式,该表达式的值为Boolean型,可以由关系运算符、逻辑运算符和empty运算符组成。如果条件表达式为真,则返回表达式1的值,否则返回表达式2的值。

empty运算符

empty运算符用来检查某一个值是否为nullempty,其语法格式为:

1
${empty X}

如果X为null,或者说X是一个长度为0的字符串,那么该表达式将返回true,如果X是一个空Map、空数组、或空集合,它们将返回true,否则返回false。

EL 隐式对象

在JSP页面中,可以利用JSP脚本来访问JSP隐式对象。但是,在免脚本的JSP页面中,则不可能访问这些隐式对象。EL允许通过提供一组自己的隐式对象来访问不同的对象。

对象 描述
pageContext 页面上下文对象,它包含了所有其他的JSP隐式对象
initParam 用于获取Web应用初始化参数的值
param 用于获取请求参数的值,应用在参数值只有一个的情况
paramValues 用于获取请求参数,应用在参数值有多个的情况
header 用于获取HTTP请求的header值
headerValues 用于获取HTTP请求的header值
cookie 用于访问由请求设置的cookie
applicationScope 用于返回包含application范围内的属性值的集合,返回值为java.util.Map对象
sessionScope 用于返回包含session范围内的属性值的集合,返回值为java.util.Map对象
requestScope 用于返回包含request范围内的属性值的集合,返回值为java.util.Map对象
pageScope 用于返回包含page范围内的属性值的集合,返回值为java.util.Map对象

initParam

initParam对象用于获取Web应用初始化参数的值。

1
2
3
4
5
6
7
8
// web.xml文件中设置一个初始化参数
<context-param>
<param-name>domain</param-name>
<param-value>http://gongchuangsu.github.io</param-value>
</context-param>

// 应用EL获取初始化参数
${initParam.domain}

param 和 paramValues

param对象用于获取请求参数的值,应用在参数值只有一个的情况,返回的结果为字符串。

1
2
3
4
5
// 通过一个输入表单设置一个请求参数
<input name="username" value="gongchuangsu" type="text">

// 应用EL获取请求参数
${param.username}

paramValues对象用于获取请求参数,应用在参数值有多个的情况,返回的结果为数组。

1
2
3
4
5
6
7
8
// 通过复选框表单设置请求参数
<input name="favorite" value="看书" type="checkbox">
<input name="favorite" value="慢跑" type="checkbox">
<input name="favorite" value="游泳" type="checkbox">
<input name="favorite" value="登山" type="checkbox">

// 应用EL获取请求参数
爱好为:${paramValues.name[0]}${paramValues.name[1]}${paramValues.name[2]}${paramValues.name[3]}

注意:在应用paramparamValues对象时,如果指定的参数不存在,则返回空的字符串,而不是返回null

header 和 headerValues

header对象用于获取HTTP请求的header值,当同一个header拥有多个不同的值的情况时,就必须使用headerValues对象。

1
2
// 应用EL表达式获取HTTP请求的header的connection属性
${header.connection}

cookie对象用于访问由请求设置的cookie。

1
2
3
4
5
6
7
8
// 通过response对象设置cookie对象
<%
Cookie cookie = new Cookie("username","gongchuangsu");
response.addCookie(cookie);
%>

// 应用EL获取cookie对象的值
${cookie.username.value}

applicationScope/sessionScope/requestScope/pageScope

applicationScope对象用于返回包含application范围内的属性值的集合,返回值为java.util.Map对象。

1
2
3
4
5
6
7
// 定义application范围内的属性
<%
application.setAttribute("username","gongchuangsu");
%>

// 应用EL获取application范围内的属性值
${applicationScope.username}

还可以访问JavaBean的属性值

1
2
3
4
5
6
7
// 定义一个JavaBean
<jsp:useBean id="user" scope="application" class="...">
<jsp:setProperty name="user" property="name" value="gongchuangsu"/>
</jsp:useBean>

// 应用EL获取JavaBean实例的name属性
${applicationScope.user.name}

sessionScope对象、requestScope对象、pageScope对象与applicationScope对象用法同理。

保留的关键字

EL中保留的关键字如下表所示:

and eq gt
instanceof div or
le false empty
not lt ge

参考资料

1、Java Web 从入门到精通
2、Servlet、JSP和Spring MVC初学指南